#include <fcntl.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/tcp.h>

#include "net/socket.h"
namespace net_tools::net
{

  Socket::Socket()
      : socketfd(socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0)){};
  Socket::~Socket()
  {
    close(socketfd);
  };
  void Socket::Set_reused(int fd)
  {
    int opt = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  };
  void Socket::Set_noblocked(int fd)
  {
    int flags;
    flags = fcntl(fd, F_GETFL, 0);
    flags |= O_NONBLOCK;
    fcntl(fd, F_SETFL, flags);
  };

  void *Socket::Stringtonet(const char *ipaddr, void *ret)
  {
    inet_pton(AF_INET, ipaddr, ret);
    return ret;
  };
  char *Socket::Nettostring(sockaddr_in addr, char *ret)
  {
    inet_ntop(AF_INET, &addr.sin_addr.s_addr, ret, INET_ADDRSTRLEN);
    return ret;
  };
  void Socket::Set_nodelay(int fd)
  {
    int opt = 1;
    setsockopt(fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
  };

} // namespace net_tools::net